package com.orkhonsoft.tengrinshar.chat.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Message;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;
public class JpushClientUtil {

	protected static final Logger LOG = LoggerFactory.getLogger(JpushClientUtil.class);
    private final static String appKey = "f0da19e02ea161dabfe156cb";
    private final static String masterSecret = "490d4da46400ac70dd368a6a";
    private static JPushClient jPushClient = new JPushClient(masterSecret, appKey);
    /**
     * 推送给设备标识参数的用户
     * 
     * @param alias
     *            别名
     * @param notification_title
     *            通知内容标题
     * @param msg_title
     *            消息内容标题
     * @param msg_content
     *            消息内容
     * @param extrasparam
     *            扩展字段
     * @return 0推送失败，1推送成功
     */
    public static int sendMessageWithAlias(String alias, String notification_title, String msg_title,String msg_content, String extrasparam) {
    	int result = 0;
    	if(alias.equals("all")){
    		try {
	            PushPayload pushPayload = JpushClientUtil.pushObjectAll(notification_title, msg_title, msg_content, extrasparam);
	            System.out.println(pushPayload);
	            PushResult pushResult = jPushClient.sendPush(pushPayload);
	            LOG.info("Got result - " + result);
	            System.out.println(pushResult);
	            if (pushResult.getResponseCode() == 200) {
	                result = 1;    
	            }
	        } catch (APIConnectionException e) {
	           
	            LOG.error("Connection error. Should retry later. ", e);
	        } catch (APIRequestException e) {
	            
	            LOG.error("Error response from JPush server. Should review and fix it. ", e);
	            LOG.info("HTTP Status: " + e.getStatus());
	            LOG.info("Error Code: " + e.getErrorCode());
	            LOG.info("Error Message: " + e.getErrorMessage());
	            LOG.info("Msg ID: " + e.getMsgId());
	        }
    	}else {
    		 try {
    	            PushPayload pushPayload = JpushClientUtil.buildPushObject_alias_alertWithTitle(alias,
    	                    notification_title, msg_title, msg_content, extrasparam);
    	            System.out.println(pushPayload);
    	            PushResult pushResult = jPushClient.sendPush(pushPayload);
    	            LOG.info("Got result - " + result);
    	            System.out.println(pushResult);
    	            if (pushResult.getResponseCode() == 200) {
    	                result = 1;    
    	            }
    	        } catch (APIConnectionException e) {
    	           
    	            LOG.error("Connection error. Should retry later. ", e);
    	        } catch (APIRequestException e) {
    	            
    	            LOG.error("Error response from JPush server. Should review and fix it. ", e);
    	            LOG.info("HTTP Status: " + e.getStatus());
    	            LOG.info("Error Code: " + e.getErrorCode());
    	            LOG.info("Error Message: " + e.getErrorMessage());
    	            LOG.info("Msg ID: " + e.getMsgId());
    	        }

    	}
       
        return result;
    }
    
    private static PushPayload pushObjectAll(String notification_title, String msg_title, String msg_content, String extrasparam){
    	System.out.println("----------buildPushObject_all_all_alert");
        return PushPayload.newBuilder()
                .setPlatform(Platform.all())
                .setAudience(Audience.all())
                // jpush的通知，android的由jpush直接下发，iOS的由apns服务器下发，Winphone的由mpns下发
                .setNotification(Notification.newBuilder()
                 .addPlatformNotification(AndroidNotification.newBuilder().setAlert(notification_title)
                                .setTitle(notification_title)
                                .addExtra("extra", extrasparam).build())
                        // 指定当前推送的iOS通知
                        .addPlatformNotification(IosNotification.newBuilder().setContentAvailable(true)
                                // 传一个IosAlert对象，指定apns title、title、subtitle等
                                .setAlert(notification_title)
                                // 直接传alert
                                // 此项是指定此推送的badge自动加1
                                .incrBadge(1)
                                // 此字段的值default表示系统默认声音；传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒，
                                // 如果系统没有此音频则以系统默认声音提醒；此字段如果传空字符串，iOS9及以上的系统是无声音提醒，以下的系统是默认声音
                                .setSound("sound.caf")
                                // 此字段为透传字段，不会显示在通知栏。用户可以通过此字段来做一些定制需求，如特定的key传要指定跳转的页面（value）
                                .addExtra("content", extrasparam).build())
        .build())
                .setMessage(Message.newBuilder()

        .setMsgContent(msg_content)

        .setTitle(msg_title)

        .addExtra("extra", extrasparam)

        .build())

        .setOptions(Options.newBuilder()
                // 此字段的值是用来指定本推送要推送的apns环境，false表示开发，true表示生产；对android和自定义消息无意义
                .setApnsProduction(false)
                // 此字段是给开发者自己给推送编号，方便推送者分辨推送记录
                .setSendno(1)
                // 此字段的值是用来指定本推送的离线保存时长，如果不传此字段则默认保存一天，最多指定保留十天；
                .setTimeToLive(86400)

        .build())

        .build();
    	
    }
    
 	private static PushPayload buildPushObject_alias_alertWithTitle(String alias,
            String notification_title, String msg_title, String msg_content, String extrasparam) {

        System.out.println("----------buildPushObject_all_all_alert");
        return PushPayload.newBuilder()
                .setPlatform(Platform.all())
                .setAudience(Audience.alias(alias))
                // jpush的通知，android的由jpush直接下发，iOS的由apns服务器下发，Winphone的由mpns下发
                .setNotification(Notification.newBuilder()
                        .addPlatformNotification(AndroidNotification.newBuilder().setAlert(notification_title)
                                .setTitle(notification_title)
                                .addExtra("extra", extrasparam).build())
                        // 指定当前推送的iOS通知
                        .addPlatformNotification(IosNotification.newBuilder().setContentAvailable(true)
                                // 传一个IosAlert对象，指定apns title、title、subtitle等
                                .setAlert(notification_title)
                                // 直接传alert
                                // 此项是指定此推送的badge自动加1
                                .incrBadge(1)
                                // 此字段的值default表示系统默认声音；传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒，
                                // 如果系统没有此音频则以系统默认声音提醒；此字段如果传空字符串，iOS9及以上的系统是无声音提醒，以下的系统是默认声音
                                .setSound("sound.caf")
                                // 此字段为透传字段，不会显示在通知栏。用户可以通过此字段来做一些定制需求，如特定的key传要指定跳转的页面（value）
                                .addExtra("content", extrasparam).build())
        .build())
                .setMessage(Message.newBuilder()

        .setMsgContent(msg_content)

        .setTitle(msg_title)

        .addExtra("extra", extrasparam)

        .build())

        .setOptions(Options.newBuilder()
                // 此字段的值是用来指定本推送要推送的apns环境，false表示开发，true表示生产；对android和自定义消息无意义
                .setApnsProduction(false)
                // 此字段是给开发者自己给推送编号，方便推送者分辨推送记录
                .setSendno(1)
                // 此字段的值是用来指定本推送的离线保存时长，如果不传此字段则默认保存一天，最多指定保留十天；
                .setTimeToLive(86400)

        .build())

        .build();

    }

}